/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import co.com.sed.model.beans.Cargo;
import co.com.sed.model.beans.Dependencia;
import co.com.sed.model.beans.Nivel;
import co.com.sed.model.util.Util;

/**
 * @author Mbarros
 *
 */
public class CargoPeer {

	private static final String BUSCAR_CARGOS =
			"SELECT id_cargo, cargo, fecha_ini, id_nivel, id_dependencia "+
			"FROM cargo ";
	
	private static final String BUSCAR_CARGOS_POR_NIVELES =
			"SELECT id_cargo, cargo, fecha_ini, id_nivel, id_dependencia "+
			"FROM cargo "+
			"WHERE id_nivel = &nivel";
	
	private static final String BUSCAR_CARGOS_POR_DEPENDENCIA =
			"SELECT id_cargo, cargo, fecha_ini, id_nivel, id_dependencia "+
			"FROM cargo "+
			"WHERE id_dependencia = &dependencia";

	private static final String BUSCAR_CARGO =
			"SELECT id_cargo, cargo, fecha_ini, id_nivel, id_dependencia "+
			"FROM cargo "+
			"WHERE id_cargo = &id_cargo";

	private static final String INSERTAR_CARGO =
			"INSERT INTO cargo( cargo, fecha_ini, id_nivel, id_dependencia) VALUES "+
			"('&cargo', '&fecha_ini', &id_nivel, &id_dependencia)";

	private static final String ACTUALIZAR_CARGO =
			"UPDATE cargo "+
			"SET cargo = &cargo, fecha_ini='&fecha_ini', id_nivel = &id_nivel "+
			"id_dependencia = &id_dependencia"+
			"WHERE id_cargo = &id_cargo";

	private static final String ELIMINAR_CARGO =
			"DELETE FROM cargo "+
			"WHERE id_cargo = &id_cargo";

		/**
		 *  busca en la base de datos todos los registros de la tabla "Cargo"
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return					lista de cargos
		 * @see         			Cargo, Statement
		 */
	
	public static ArrayList<Cargo> buscarCargos(Statement stmt) {
			ArrayList<Cargo> cargos = new ArrayList<Cargo>();

			String sql = BUSCAR_CARGOS;

			ResultSet rs;
				try {
					rs = stmt.executeQuery(sql);
					try {
						while (rs.next()) {
							Cargo car = new Cargo();
				
							car.setIdCargo(rs.getInt("id_cargo"));
							car.setCargo(rs.getString("cargo"));
							car.setFechaInicial(rs.getDate("fecha_ini"));
							car.setNivel(new Nivel (rs.getInt("id_nivel")));
							car.setDependencia(new Dependencia(rs.getInt("id_dependencia")));
											
							cargos.add(car);
						}
					} finally {
						rs.close();
					}
				} catch (SQLException e) {
					Util.print("No es posible consultar la base de datos:"
							+ e.getMessage());
					e.printStackTrace();
				}

				return cargos;
	}
	
		/**
		 *  busca en la base de datos todos los registros de la tabla "Cargo" que pertenezcan a nivel
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return					lista de cargos
		 * @see         			Cargo, Statement
		 */
	
	public static ArrayList<Cargo> buscarCargosPorNiveles(Statement stmt, int id_nivel) {
			ArrayList<Cargo> cargos = new ArrayList<Cargo>();
	
			String sql = BUSCAR_CARGOS_POR_NIVELES;
			
			// se setean los "parametros"
			sql = sql.replaceAll("&nivel", "" + id_nivel);
	
			ResultSet rs;
				try {
					rs = stmt.executeQuery(sql);
					try {
						while (rs.next()) {
							Cargo car = new Cargo();
				
							car.setIdCargo(rs.getInt("id_cargo"));
							car.setCargo(rs.getString("cargo"));
							car.setFechaInicial(rs.getDate("fecha_ini"));
							car.setNivel(new Nivel (rs.getInt("id_nivel")));
							car.setDependencia(new Dependencia(rs.getInt("id_dependencia")));
											
							cargos.add(car);
						}
					} finally {
						rs.close();
					}
				} catch (SQLException e) {
					Util.print("No es posible consultar la base de datos:"
							+ e.getMessage());
					e.printStackTrace();
				}
	
				return cargos;
	}
	
		/**
		 *  busca en la base de datos todos los registros de la tabla "Cargo" que pertenezcan a nivel
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return					lista de cargos
		 * @see         			Cargo, Statement
		 */
	
	public static ArrayList<Cargo> buscarCargosPorDependencias(Statement stmt, int id_dependencia) {
			ArrayList<Cargo> cargos = new ArrayList<Cargo>();
	
			String sql = BUSCAR_CARGOS_POR_DEPENDENCIA;
			
			// se setean los "parametros"
			sql = sql.replaceAll("&dependencia", "" + id_dependencia);
	
			ResultSet rs;
				try {
					rs = stmt.executeQuery(sql);
					try {
						while (rs.next()) {
							Cargo car = new Cargo();
				
							car.setIdCargo(rs.getInt("id_cargo"));
							car.setCargo(rs.getString("cargo"));
							car.setFechaInicial(rs.getDate("fecha_ini"));
							car.setNivel(new Nivel (rs.getInt("id_nivel")));
							car.setDependencia(new Dependencia(rs.getInt("id_dependencia")));
											
							cargos.add(car);
						}
					} finally {
						rs.close();
					}
				} catch (SQLException e) {
					Util.print("No es posible consultar la base de datos:"
							+ e.getMessage());
					e.printStackTrace();
				}
	
				return cargos;
	}


		/**
		 *  busca en la base de datos un registro de la tabla "Cargo"
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * @param cargo				id de la Cargo que se desea cosultar
		 * 
		 * @return					cargo buscado
		 * @see         			Cargo, Statement
		 */
	
	public static Cargo buscarCargo(Statement stmt, int idCargo) {
			Cargo car = new Cargo();

			String sql = BUSCAR_CARGO;
	
			// se setean los "parametros"
			sql = sql.replaceAll("&id_cargo", "" + idCargo);
	
				ResultSet rs;
				try {
					rs = stmt.executeQuery(sql);
					try {
						if (rs.next()) {
							car.setIdCargo(rs.getInt("id_cargo"));
							car.setCargo(rs.getString("cargo"));
							car.setFechaInicial(rs.getDate("fecha_ini"));
							car.setNivel(new Nivel (rs.getInt("id_nivel")));
							car.setDependencia(new Dependencia(rs.getInt("id_dependencia")));				
				
						}
					} finally {
						rs.close();
					}
				} catch (SQLException e) {
					Util.print("No es posible consultar la base de datos:" + e.getMessage());
					e.printStackTrace();
				}

				return car;
	}


		/**
		 *  Inserta un cargo en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param cargo				cargo que se va a insertar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al insertar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static int insertarCargo(Statement stmt, Cargo cargo) throws SQLException {
		int idNuevoCargo = -1;
		ResultSet rs = null;
		
		
		try {
		String sql = INSERTAR_CARGO;
		// se setean los "parametros": &id_cargo, '&cargo', '&fecha_ini', '&fecha_egr', &id_nivel, &id_dependencia, &funcionario

		sql = sql.replaceAll("&cargo", ""+cargo.getCargo())
				 .replaceAll("&fecha_ini",  Util.sqlFormatDate(cargo.getFechaInicial()))		
				 .replaceAll("&id_nivel", ""+cargo.getNivel().getIdNivel())
				 .replaceAll("&id_dependencia", ""+cargo.getDependencia().getIdDependencia());
								
		stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
		
		rs = stmt.getGeneratedKeys();
		if (rs.next()) {
			idNuevoCargo = rs.getInt("id_cargo");
			Util.print("nuevo registro: " + idNuevoCargo);
		}
	} finally {
		rs.close();
	}

	return idNuevoCargo;
	}

	
		/**
		 *  Actualiza un Cargo en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param c	argo			cargo que se va a actualizar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al actualizar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void actualizarCargo(Statement stmt, Cargo cargo) throws SQLException {
		String sql = ACTUALIZAR_CARGO;
		// se setean los "parametros": &fecha_ini, &fecha_egr, &id_nivel, &id_dependencia, &funcionario
		sql = sql.replaceAll("&id_cargo", ""+ cargo.getIdCargo())
	 			.replaceAll("&cargo", ""+cargo.getCargo())
	 			.replaceAll("&fecha_ini",  Util.sqlFormatDate(cargo.getFechaInicial()))		
	 			.replaceAll("&id_nivel", ""+cargo.getNivel().getIdNivel())
	 			.replaceAll("&id_dependencia", ""+cargo.getDependencia().getIdDependencia());
	
		stmt.executeUpdate(sql);
	}

		/**
		 *  Elimina un Cargo en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param cargo				cargo que se va a eliminar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al eliminar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void eliminarCargo(Statement stmt, Cargo cargo) throws SQLException {
		String sql = ELIMINAR_CARGO;
		// se setean los "parametros": &id_cargo
		sql = sql.replaceAll("&id_cargo", "" + cargo.getIdCargo());
	
		stmt.executeUpdate(sql);
	}
	

}
